package pachet;

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import cifre.Cinci;
import cifre.Cincisute;
import cifre.Cincizeci;
import cifre.ExpresieNula;
import cifre.Mie;
import cifre.Suta;
import cifre.Unu;
import cifre.Zece;

public class Main extends JFrame implements ActionListener{
	//cele 3 variabile determina cei 3 parametrii ai ferestrei.
	// Cele 2 casete text(parametru si rezultat) si butonul
	// la a carui apasare se face calculul
	JButton submit;
	JTextField parametru;
	JTextField rezultat;

	public void creareMediuGrafic(){
		// 'fereastra' este containerul in care vor fi asezate
		// butoanele si casutele text
		JFrame fereastra=new JFrame();
		fereastra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fereastra.setAlwaysOnTop(true);
		Container suprafata=fereastra.getContentPane();
		suprafata.setLayout(new BoxLayout(suprafata,BoxLayout.Y_AXIS));
		//obiectele se aseaza pe rand in zona de reprezentare
		// a ferestrei obtinuta cu getContentPane()
		JLabel info=new JLabel("Introduceti numarul in cifre romane:");
		info.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(info);
		parametru=new JTextField(12);
		parametru.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(parametru);
		submit=new JButton("Calculeaza");
		submit.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(submit);
		submit.addActionListener(this);
		rezultat=new JTextField(12);
		rezultat.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(rezultat);
		rezultat.setEditable(false);
		// se incarca elementele in fereastra, functia pack
		//si se face fereastra vizibila
		fereastra.pack();
		fereastra.setVisible(true);
		}
		// functia care 'asculta' la apasarea butonului
		
		public void actionPerformed(ActionEvent event) {
			if (event.getSource().equals(submit)){
				rezultat.setText(calculat(parametru.getText()));
			}
		}
		// functia in care se face trimiterea spre functiile
		// de interpretare din diferitele clase de interpretare
		
		public String calculat(String sirPars){
			// de tip context este rezultatul care va fi dat
			// ca parametru diferitelor functii
			// interpretor pentru a fi modificat
			Context rezultat = new Context();
			sirPars = sirPars.toUpperCase();
			char[] lista = sirPars.toCharArray();
			
			for (char c : lista) {
				// ExpresieAbstracta este clasa abstracta care tine
				// antetul functiei interpretor
				ExpresieAbstracta expr=new ExpresieNula();
				switch (c) {
				case 'I':
					expr = new Unu();
					break;
				case 'V':
					expr = new Cinci();
					break;
				case 'X':
					expr = new Zece();
					break;
				case 'L':
					expr = new Cincizeci();
					break;
				case 'C':
					expr = new Suta();
					break;
				case 'D':
					expr = new Cincisute();
					break;
				case 'M':
					expr = new Mie();
					break;
				}
				expr.interpretor(rezultat);
		}
		return String.valueOf(rezultat.returneazaFinal());
		}
		// functia principala care lanseaza modulul grafic
		public static void main(String[]args){
		Main p=new Main();
		p.creareMediuGrafic();
		}
	}